/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controller;

import Model.Medico;
import java.sql.Date;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author RodrigoDantas
 */
public class MedicoDao {
    private static final MedicoDao INSTANCE = new MedicoDao();
    private ArrayList<Medico> listaMedico = new ArrayList<Medico>();
    private ArrayList<Medico> listaEspecialidade = new ArrayList<Medico>();
    BancoDeDados bd = null;
    private int idGen = 0;
    public MedicoDao(){
       carregaLista();
    }
    
    public void carregaLista(){
        bd = new BancoDeDados();
        try {
            bd.conectar();
            bd.sql = "SELECT * FROM \"medico\"";
            
            bd.comandoSql = bd.connection.prepareStatement(bd.sql);
            ResultSet rs  = bd.comandoSql.executeQuery();
            
            int    id_medico;
            int    numero;
            char   sexo;
            String nome;
            String cpf;
            String telefone;
            String rua;
            String bairro;
            String cidade;
            String estado;
            Date   nascimento;
            String crm;
            String uf_crm;
            String especialidade;
            int horario;
            
            Medico medico;
            
            while(rs.next()){
                
                
                nome          = rs.getString(1);
                uf_crm        = rs.getString(2);
                crm           = rs.getString(3);
                telefone      = rs.getString(4);
                id_medico     = rs.getInt(5);
                nascimento    = rs.getDate(6);
                especialidade = rs.getString(7);
                cpf           = rs.getString(8);
                rua           = rs.getString(9);
                bairro        = rs.getString(10);
                cidade        = rs.getString(11);
                estado        = rs.getString(12);
                sexo          = (char)rs.getCharacterStream(13).read();
                horario       = rs.getInt(14);
                
                
              
              medico    = new Medico(nome, uf_crm, crm, telefone, id_medico, nascimento, especialidade, cpf, rua, bairro, cidade, estado, sexo , horario);
              
              listaMedico.add(medico);           
            }
            
            //idGen = id_animal;
            bd.desconectar();
        } catch (Exception ex) {
            Logger.getLogger(MedicoDao.class.getName()).log(Level.SEVERE, null, ex);
        }
    }     
    
     public int getIdGen() {
        return idGen;
    }

    public void setIdGen(int idGen) {
        this.idGen = idGen;
    }
    
     
    public void insereMedico(String nome, String uf_crm, String crm, String telefone,int id_medico, Date nascimento, String especialidade, String cpf, String rua, String bairro, String cidade, String estado, char sexo, int horario){
        bd = new BancoDeDados();
        setIdGen(getIdGen()+1);
        try {
            bd.conectar();
            bd.sql = "INSERT INTO \"medico\" VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
            bd.comandoSql = bd.connection.prepareStatement(bd.sql);
            bd.comandoSql.setString(1, nome);
            bd.comandoSql.setString(2, uf_crm);
            bd.comandoSql.setString(3, crm);
            bd.comandoSql.setString(4, telefone);
            bd.comandoSql.setInt(5, getIdGen());
            bd.comandoSql.setDate(6, nascimento);
            bd.comandoSql.setString(7, especialidade);
            bd.comandoSql.setString(8, cpf);
            bd.comandoSql.setString(9, rua);
            bd.comandoSql.setString(10, bairro);
            bd.comandoSql.setString(11, cidade);
            bd.comandoSql.setString(12, estado);
            bd.comandoSql.setString(13, String.valueOf(sexo));
            bd.comandoSql.setInt(14, horario);
            
            bd.comandoSql.executeUpdate();
            
            listaMedico.add(new Medico(nome, uf_crm, crm, telefone, getIdGen(), nascimento, especialidade, cpf, rua, bairro, cidade, estado, sexo, horario));
            setIdGen(idGen+1);
        } catch (Exception ex) {
            Logger.getLogger(PacienteDao.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
     
     
    public static MedicoDao getINSTANCE() {
        return INSTANCE;
    }
    
    public int getNextId(){
        return idGen+1;
    }

    public ArrayList<Medico> getListaMedico() {
        return listaMedico;
    }

    public Medico findById(int id) {
        for(Medico medico : listaMedico)
            if(medico.getId_medico() == id)
                return medico;
        return null;
    }
    
    public Medico findByNome(String nome) {
        for(Medico medico : listaMedico)
            if(medico.getNome().equals(nome))
                return medico;
        return null;
    }
    
     
    
    public void findByEspecialidade(String especialidade) {
        for(Medico medico : listaMedico)
            if(medico.getEspecialidade().equals(especialidade))
                listaEspecialidade.add(medico);
        
    }

    public ArrayList<Medico> getListaEspecialidade() {
        return listaEspecialidade;
    }

    public void setListaEspecialidade(ArrayList<Medico> listaEspecialidade) {
        this.listaEspecialidade = listaEspecialidade;
    }

    public void atualizaMedico(int id_medico, int numero, char sexo, String nome, String cpf, String telefone, String rua, String bairro, String cidade, String estado, int idVelho){
       
        bd = new BancoDeDados();
        try {
            bd.conectar();
            bd.sql = "UPDATE \"medico\" SET  \"Id_medico\" = ?, \"numero\" = ?, \"sexo\" = ?, \"nome\" = ?, \"cpf\" = ?, "
                     +"\"telefone\" = ?, \"rua\" = ?, \"bairro\"= ?, \"cidade\"= ?, \"estado\"= ?. \"Estado\"= ?  WHERE \"id_velho\" = ?";
            bd.comandoSql = bd.connection.prepareStatement(bd.sql);
             bd.comandoSql.setInt(1, id_medico);
            bd.comandoSql.setInt(2, numero);
            bd.comandoSql.setString(3, String.valueOf(sexo));
            bd.comandoSql.setString(4, nome);
            bd.comandoSql.setString(5, cpf);
            bd.comandoSql.setString(6, telefone);
            bd.comandoSql.setString(7, rua);
            bd.comandoSql.setString(8, bairro);
            bd.comandoSql.setString(9, cidade);
            bd.comandoSql.setString(10, estado);
            
            
            bd.comandoSql.executeUpdate();
            
            listaMedico.remove(findById(idVelho));
            
            //Medico medico = new Medico(id_medico, numero, sexo, nome, cpf, telefone, rua, bairro, cidade, estado);
                            
            //listaMedico.add(medico);
            
        } catch (Exception ex) {
            Logger.getLogger(PacienteDao.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        
    }

    public void excluirMedico(int id) {
        bd = new BancoDeDados();
        try {
            bd.conectar();
            bd.sql = "DELETE FROM \"medico\" WHERE \"Id_medico\" = ?";
            bd.comandoSql = bd.connection.prepareStatement(bd.sql);
            bd.comandoSql.setInt(1, id);
            bd.comandoSql.executeUpdate();
            
            listaMedico.remove(findById(id));
            
        } catch (Exception ex) {
            Logger.getLogger(MedicoDao.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public void excluirMedicoNome(String nome) {
        bd = new BancoDeDados();
        try {
            bd.conectar();
            bd.sql = "DELETE FROM \"medico\" WHERE \"Nome\" = ?";
            bd.comandoSql = bd.connection.prepareStatement(bd.sql);
            bd.comandoSql.setString(1, nome);
            bd.comandoSql.executeUpdate();
            
            listaMedico.remove(findByNome(nome));
            
        } catch (Exception ex) {
            Logger.getLogger(PacienteDao.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

}
